package com.sky.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.CategoryMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author bairimengchang
 * @version 1.0
 * @project sky-take-out
 * @description 分类管理业务接口实现类
 * @date 2024/08/04 16:38:47
 */
@Service
@Slf4j
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private DishMapper dishMapper;

    @Autowired
    private SetmealMapper setmealMapper;

    /**
     * 新增分类
     * @param categoryDTO 分类数据传输数据模型
     * @return 新增操作是否成功，返回 true 表示成功，false 表示失败
     */
    @Override
    public boolean addCategory(CategoryDTO categoryDTO) {
        Category category = new Category();
        BeanUtils.copyProperties(categoryDTO, category);
        //默认是禁用的，不展示给用户
        category.setStatus(StatusConstant.DISABLE);

        int insert = categoryMapper.insertSelective(category);
        return insert == 1;
    }

    /**
     * 获取分类列表
     * @param categoryPageQueryDTO 分类分页查询时传递的数据模型
     * @return 包含分类列表的分页结果对象
     */
    @Override
    public PageResult getCategoryList(CategoryPageQueryDTO categoryPageQueryDTO) {
        PageResult pageResult = new PageResult();
        PageHelper.startPage(categoryPageQueryDTO.getPage(), categoryPageQueryDTO.getPageSize());

        List<Category> categoryList = categoryMapper.selectByPageQuery(categoryPageQueryDTO);
        PageInfo<Category> pageInfo = new PageInfo<>(categoryList);

        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setRecords(pageInfo.getList());

        return pageResult;
    }

    /**
     * 修改分类启用状态
     * @param status 分类启用状态 1改成启用 2改成禁用
     * @param id 要进行修改状态的分类id
     * @return 修改操作是否成功，返回 true 表示成功，false 表示失败
     */
    @Override
    public boolean changeCategoryStatus(Integer status, Long id) {
        //这里不需要去判断分类关联的菜品信息，因为这里直接影响用户能否看到这个分类信息
        Category category = Category.builder().status(status).id(id).build();
        int update = categoryMapper.updateByPrimaryKeySelective(category);
        return update == 1;
    }

    /**
     * 根据传来的分类信息编辑分类
     * @param categoryDTO 分类数据传输数据模型
     * @return 修改操作是否成功，返回 true 表示成功，false 表示失败
     */
    @Override
    public boolean editCategory(CategoryDTO categoryDTO) {
        Category category = new Category();
        BeanUtils.copyProperties(categoryDTO, category);

        int update = categoryMapper.updateByPrimaryKeySelective(category);
        return update == 1;
    }

    /**
     * 根据类型查询分类
     * @param type 要查询的类型 1菜品分类 2 套餐分类
     * @return 符合查询类型的分类信息实体
     */
    @Override
    public List<Category> getCategoryListByType(Integer type) {
        return categoryMapper.selectCategoryListByType(type);
    }

    /**
     * 根据id删除分类
     * @param id 要进行删除操作的分类id
     * @return 删除成功或失败信息
     */
    @Override
    public boolean removeCategoryById(Long id) {

        //先根据id查询这个分类id下是否有菜品，对应dish表中category_id字段
        List<Dish> dishList = dishMapper.selectDishByCategoryId(id);
        if (!dishList.isEmpty()){
            throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);
        }

        //再根据id查询这个分类id下是否有套餐，对应setmeal表中的category_id字段
        List<Setmeal> setmealList = setmealMapper.selectSetMealByCategoryId(id);
        if (!setmealList.isEmpty()){
            throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);
        }

        int delete = categoryMapper.deleteByPrimaryKey(id);
        return delete == 1;
    }
}
